package io.adrainty.bolee.file.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.adrainty.bolee.file.models.entity.FileEntity;
import io.adrainty.bolee.file.models.entity.FilePartEntity;
import io.adrainty.bolee.file.models.request.UploadMultipartFileDTO;

import java.util.Collection;
import java.util.List;

/**
 * @author AdRainty
 * @version V1.0.0
 * @since 2025/8/17 下午11:48
 */
public interface IFileService {

    /**
     * 上传文件
     *
     * @param multipartFileDTO 文件信息
     * @param param            参数
     * @return 文件信息
     */
    FileEntity upload(UploadMultipartFileDTO multipartFileDTO, FileEntity param);

    /**
     * 初始化分片上传
     *
     * @param fileVO 文件信息
     * @return 文件信息
     */
    FileEntity initiateMultipartUpload(FileEntity fileVO);

    /**
     * 上传分片
     *
     * @param uploadMultipartFile 文件信息
     * @param filePartVO          文件信息
     * @return 文件信息
     */
    String uploadPart(UploadMultipartFileDTO uploadMultipartFile, FilePartEntity filePartVO);

    /**
     * 完成分片上传
     *
     * @param fileVO 文件信息
     * @return 文件信息
     */
    String completeMultipartUpload(FileEntity fileVO);

    /**
     * 清理文件
     *
     * @return 是否成功
     */
    Boolean clearFile();

    /**
     * 清理文件
     *
     * @param fileId 文件ID
     * @return 是否成功
     */
    Boolean clearFileById(Long fileId);

    /**
     * 绑定文件
     *
     * @param fileVOs 文件信息
     * @return 是否成功
     */
    Boolean replaceBindBatchFile(List<FileEntity> fileVOs);

    /**
     * 批量绑定文件
     *
     * @param bindFileList 文件信息
     * @return 是否成功
     */
    List<FileEntity> bindBatchFile(List<FileEntity> bindFileList);

    /**
     * 批量删除文件
     *
     * @param delIdList 文件ID列表
     * @return 是否成功
     */
    Boolean deleteFileInIdList(Collection<Long> delIdList);

    /**
     * 根据业务ID查询文件
     *
     * @param businessIds 业务ID列表
     * @return 文件列表
     */
    List<FileEntity> findInBusinessIds(List<Long> businessIds);

    /**
     * 分页查询文件
     *
     * @param pageNum  页码
     * @param pageSize 页大小
     * @param param    参数
     * @return 文件列表
     */
    IPage<FileEntity> pageFile(Integer pageNum, Integer pageSize, FileEntity param);

    /**
     * 批量删除文件
     *
     * @param businessIds 业务数据ID列表
     * @return 是否成功
     */
    Boolean deleteFileInBusinessIds(List<Long> businessIds);
}
